// 导入初始化token
import { getToken, setToken, removeToken, setTimeKey } from "@/utils/auth";
// 调用登录的API接口
import { login, getUserInfo, getUserProfile } from "@/api/user";
// 引入路由模块中，重置路由的方法
import { resetRouter } from "@/router";
// 共享状态
const state = {
  token: getToken(), // 设置初始化token状态
  userInfo: {}
};
// 修改状态
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token; // 设置token

    setToken(token); //vuex和 缓存数据同步token状态
  },
  // 删除token
  removeToken() {
    state.token = null; // 删除vuex的token
    removeToken(); // 删除缓存中的token
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo }; // 浅拷贝
    // state.userInfo = userInfo; // 对象直接赋值
  },
  // 删除用户信息  state?
  removeUserInfo(state) {
    state.userInfo = {};
  }
};
// 执行异步
const actions = {
  // context表示当前的store的实例 === this.$store
  async login(context, data) {
    // 调用接口,在响应拦截器，已经处理过获取到的数据，不需要再解构
    const result = await login(data); // 拿到token
    // 通过调用 mutations中的方法，来设置token的状态
    context.commit("setToken", result); // 设置token
    // 在store/getters 中建立快捷访问
    // 写入时间戳
    // setTimeKey(); // 将当前的最新时间写入缓存
  },
  // 调用获取用户信息接口
  async getUserInfo(context) {
    const result = await getUserInfo();
    // 获取用户信息,执行完后再执行获取用户头像接口
    const baseInfo = await getUserProfile(result.userId);
    // 合并接口数据
    const baseResult = { ...result, ...baseInfo };
    context.commit("setUserInfo", baseResult);
    return result; // 当前用户资料
  },
  // 用户退出功能
  logout(context) {
    // 清空token
    context.commit("removeToken");
    // 清除用户信息
    context.commit("removeUserInfo");
    // 清空动态路由
    resetRouter();
    // 调用兄弟模块中的数据（permission/setRoutes) 静态路由和动态路由合并到一起
    // 把setRoutes中动态路由清空，因为子模块中都加有命名空间，所以需要加第三个参数 {root: true} 这是调用根节点中的数据，这样才能调用兄弟模块中的数据
    context.commit("permission/setRoutes", [], { root: true });
  }
};
// 默认导出
export default {
  namespaced: true, // 开启模块化命名空间，调用的时候需要加模块名
  state,
  mutations,
  actions
};
